// The MIT License (MIT)
//
// Copyright (c) 2019 Hellobike Group
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.

// ignore_for_file: avoid_positional_boolean_parameters

import 'dart:async';

import 'package:flutter/widgets.dart';

import 'navigator_route.dart';

/// Signature of page builder with RouteSettings.
///
typedef NavigatorPageBuilder = Widget Function(RouteSettings settings);

/// Signature of route builder with NavigatorPageBuilder and RouteSettings.
///
typedef NavigatorRouteBuilder = NavigatorRoute Function(
  NavigatorPageBuilder pageBuilder,
  RouteSettings settings,
);

/// Signature of callbacks with bool parameter.
///
typedef NavigatorBoolCallback = void Function(bool result);

/// Signature of callbacks with int parameter.
///
typedef NavigatorIntCallback = void Function(int index);

/// Signature of callbacks with dynamic parameter.
///
typedef NavigatorParamsCallback = void Function(dynamic params);

/// Signature of page observer callbacks with RouteSettings.
///
typedef NavigatorPageObserverCallback = void Function(RouteSettings settings);

enum NavigatorRoutePushHandleType {
  none, // Do not prevent routing actions from continuing
  prevention, // Prevent routing behavior from continuing
}

/// Signature of route push handler with RouteSettings.
///
typedef NavigatorRoutePushHandle = Future<NavigatorRoutePushHandleType>
    Function(
  RouteSettings settings, {
  bool animated,
});

/// Signature of push begin handler with url.
///
/// return a new url for redirect.
///
typedef NavigatorPushBeginHandle = Future<String?> Function<TParams>(
  String url, {
  TParams? params,
  String? fromURL,
  String? innerURL,
});

/// Signature of push end handler.
///
typedef NavigatorPushEndHandle = Future<void> Function<TParams, TPopParams>(
  String url, {
  TParams? params,
  String? fromURL,
  String? innerURL,
  TPopParams? popResult,
});
